using System;
using System.Globalization;
using System.Windows.Data;
using WPFTemplateLib.WpfConverters.Core;

namespace WPFTemplateLib.WpfConverters
{
	/// <summary>
	/// [转换器] 可空类型对象转换为实际类型的值。（By Copilot）
	/// 作用：当源为可空值类型（如 int? bool? 等）而目标绑定需要非可空值类型时，返回其实际值；
	/// 如果为 null 则返回默认值(或参数指定的值)。
	/// 使用：Parameter 可指定空值时的替代值，例如 Parameter="0" 或 Parameter="False"。
	/// </summary>
	public class NullableToActualConverter : ValueConverterBase
	{
		/// <inheritdoc />
		public override object Convert(object value, Type targetType, object parameter, CultureInfo culture)
		{
			// 有值直接返回（可空值类型在装箱时若有值会被装箱成其基础类型本身）。
			if (value != null)
			{
				return value;
			}

			// value 为空，尝试使用参数提供的默认值。
			if (parameter != null)
			{
				string paraStr = parameter + "";
				try
				{
					if (targetType == typeof(string))
						return paraStr;
					if (targetType.IsEnum)
						return Enum.Parse(targetType, paraStr, true);
					// 使用 Convert.ChangeType 处理常见基础类型
					return System.Convert.ChangeType(parameter, targetType, culture);
				}
				catch
				{
					// 忽略参数转换失败，继续返回默认值
				}
			}

			// 没有参数或参数转换失败，若目标是值类型则返回其默认值；引用类型返回 null。
			if (targetType.IsValueType)
			{
				try
				{
					return Activator.CreateInstance(targetType);
				}
				catch
				{
					return Binding.DoNothing; // 极少数情况（如指针）直接不处理
				}
			}

			return null; // 引用类型直接保持 null
		}
	}
}
